Laravel 的驗證系統讓我們可以輕鬆地限制與過濾輸入參數的格式,若驗證不通過,系統會自動回傳 422 Unprocessable Content 錯誤,省去了許多額外的設定與處理。
你可以在 Controller 中,透過 $request->validate()
直接進行參數驗證:
$validated = $request->validate([
'title' => 'required|unique:posts|max:255',
'body' => 'required',
]);
這樣一來,當驗證失敗時 Laravel 會自動拋出錯誤並回應對應的錯誤訊息。
更進一步,我們可以透過繼承 FormRequest 類別的方式,將驗證邏輯與 Controller 分離。
php artisan make:request StorePostRequest
建立後,會在 App\Http\Requests
目錄下產生 StorePostRequest.php
,接著可以在 rules()
方法中定義驗證邏輯:
public function rules(): array
{
return [
'title' => 'required|unique:posts|max:255',
'body' => 'required',
];
}
在 Controller 中使用時,只需將 StorePostRequest 注入方法參數:
public function store(StorePostRequest $request)
{
$validated = $request->validated();
// 處理驗證通過後的邏輯...
}
如果需要根據複雜邏輯(例如與資料庫比對)進行額外驗證,可以覆寫 after()
方法:
use Illuminate\Contracts\Validation\Validator;
public function after(): array
{
return [
function (Validator $validator) {
// 假設要驗證 posts 表中沒有包含 title 字串的資料
if (!DB::table('posts')->where('title', 'like', '%' . $this->title . '%')->exists()) {
$validator->errors()->add('title', '找不到相關的標題內容');
}
}
];
}
記得引入 DB:
use Illuminate\Support\Facades\DB;
你也可以透過覆寫 messages() 方法,來設定自訂錯誤訊息:
public function messages(): array
{
return [
'title.required' => '標題為必填項目',
'title.unique' => '標題已經被使用',
'title.max' => '標題長度不能超過 255 字元',
'body.required' => '內容為必填項目',
];
}
Laravel 提供了彈性且強大的驗證系統,常見的驗證方式有:
在 Controller 中使用 $request->validate()
建立 FormRequest
類別,集中驗證邏輯
使用 after()
進行複雜邏輯的驗證
客製化錯誤訊息,提供更友善的提示
建議在開發中多使用 FormRequest
,可以讓 Controller
更乾淨,驗證邏輯更集中易維護。
如需更多驗證規則,可參考官方文件:Laravel Validation
官方文件